package generic;

import java.util.ArrayList;

/**
 * 自定义泛型方法
 * 修饰符 <T,R>返回类型 方法名(参数列表){
 *
 * }
 */
public class CustomGenericMethod {

    public static void main(String[] args) {
        /*
            1)泛型方法，可以定义在普通类中，也可以定义在泛型类中
            2)当泛型方法被调用时，类型会确定
            3)public void eat(E e){},修饰符后没有<T,R...> eat 方法不是泛型方法，而是使用了泛型
         */
        Car car = new Car();
        car.fly("宝马", 100);//当调用方法时，传入参数，编译器，就会确定类型
        System.out.println("=======");
        car.fly(300, 100.1);//当调用方法时，传入参数，编译器，就会确定类型

        //测试
        //T->String, R-> ArrayList
        Fish<String, ArrayList> fish = new Fish<>();
        fish.hello(new ArrayList(), 11.3f);
    }
}

class Car {

    public void run() {//普通方法

    }

    public <T, R> void fly(T t, R r) {//泛型方法
        System.out.println(t.getClass());//String
        System.out.println(r.getClass());//Integer
    }
}

class Fish<T,R> {

    public void run() {//普通方法

    }

    public<U,M> void eat(U u, M m) {//泛型方法

    }

    public void hi(T t) {

    }

    //泛型方法，可以使用类声明的泛型，也可以使用自己声明泛型
    public<K> void hello(R r, K k) {
        System.out.println(r.getClass());//ArrayList
        System.out.println(k.getClass());//Float
    }
}